﻿package frEngine.animateControler.particleControler.animate
{
    import __AS3__.vec.*;
    import flash.geom.*;
    import frEngine.animateControler.particleControler.*;
    import frEngine.math.*;
    import frEngine.shader.filters.*;

    public class UseAutoRotate extends Object implements IParticleAnimate
    {
        private var _isOpen:Boolean;
        private var _useRotateToVelocity:Boolean = false;
        public static const instance:UseAutoRotate = new UseAutoRotate;

        public function UseAutoRotate()
        {
            return;
        }// end function

        public function get objClass() : Class
        {
            return UseAutoRotate;
        }// end function

        public function canOpen(param1:ParticleParams) : Boolean
        {
            return true;
        }// end function

        private function updateIsOpen(param1:ParticleStatus) : void
        {
            var _loc_4:ParticleItem = null;
            var _loc_5:Vector3D = null;
            var _loc_7:Number = NaN;
            var _loc_8:Number = NaN;
            var _loc_9:Vector3D = null;
            var _loc_10:Number = NaN;
            var _loc_11:Number = NaN;
            var _loc_12:Number = NaN;
            var _loc_13:Number = NaN;
            var _loc_14:Quaternion = null;
            var _loc_15:Number = NaN;
            var _loc_2:* = param1.particleList;
            var _loc_3:* = _loc_2.length;
            var _loc_6:int = 0;
            while (_loc_6 < _loc_3)
            {
                
                _loc_4 = _loc_2[_loc_6];
                if (!_loc_4.visible || !_loc_4.toUpdate)
                {
                }
                else
                {
                    _loc_7 = _loc_4.aRotateAngle * _loc_4.lifeRate + _loc_4.aRotateAngleOffset;
                    _loc_8 = Math.sin(_loc_7);
                    _loc_9 = _loc_4.aRotateAxis;
                    _loc_10 = _loc_9.x * _loc_8;
                    _loc_11 = _loc_9.y * _loc_8;
                    _loc_12 = _loc_9.z * _loc_8;
                    _loc_13 = Math.cos(_loc_7);
                    _loc_14 = _loc_4.selfRotate;
                    _loc_15 = _loc_10 * _loc_10 + _loc_11 * _loc_11 + _loc_12 * _loc_12 + _loc_13 * _loc_13;
                    _loc_15 = Math.sqrt(_loc_15);
                    _loc_14.x = _loc_10 / _loc_15;
                    _loc_14.y = _loc_11 / _loc_15;
                    _loc_14.z = _loc_12 / _loc_15;
                    _loc_14.w = _loc_13 / _loc_15;
                }
                _loc_6++;
            }
            return;
        }// end function

        private function updateDefault(param1:ParticleStatus) : void
        {
            var _loc_4:ParticleItem = null;
            var _loc_5:Vector3D = null;
            var _loc_7:Quaternion = null;
            var _loc_2:* = param1.particleList;
            var _loc_3:* = _loc_2.length;
            var _loc_6:int = 0;
            while (_loc_6 < _loc_3)
            {
                
                _loc_4 = _loc_2[_loc_6];
                if (!_loc_4.visible || !_loc_4.toUpdate)
                {
                }
                else
                {
                    _loc_7 = _loc_4.selfRotate;
                    if (_loc_7.w != 1)
                    {
                        _loc_7.x = 0;
                        _loc_7.y = 0;
                        _loc_7.z = 0;
                        _loc_7.w = 1;
                    }
                }
                _loc_6++;
            }
            return;
        }// end function

        public function update(param1:ParticleStatus) : void
        {
            if (this._isOpen)
            {
                this.updateIsOpen(param1);
            }
            else if (param1.useSelfRotate)
            {
                this.updateDefault(param1);
            }
            return;
        }// end function

        public function init(param1:ParticleStatus, param2:ParticleParams) : void
        {
            this._isOpen = param2.useAutoRotate && !param2.useRotateToVelocity;
            if (this._isOpen)
            {
                param1.useSelfRotate = true;
                if (param1.isFaceCamera)
                {
                    this.initFaceCamera(param1, param2);
                }
                else
                {
                    this.initNoFaceCamera(param1, param2);
                }
            }
            return;
        }// end function

        private function initFaceCamera(param1:ParticleStatus, param2:ParticleParams) : void
        {
            var _loc_5:ParticleItem = null;
            var _loc_9:int = 0;
            var _loc_10:Vector3D = null;
            var _loc_3:* = param1.particleList;
            var _loc_4:* = _loc_3.length;
            var _loc_6:* = param2.surfaceData["" + FilterName_ID.PARAM3_ID + ":4:true"];
            var _loc_7:* = param2.numOfmeshVertex;
            var _loc_8:int = 0;
            while (_loc_8 < _loc_4)
            {
                
                _loc_5 = _loc_3[_loc_8];
                _loc_9 = _loc_8 * _loc_7 * 4;
                _loc_5.aRotateAngle = _loc_6[_loc_9++];
                _loc_5.aRotateAngleOffset = _loc_6[_loc_9++];
                _loc_10 = _loc_5.aRotateAxis;
                _loc_10.x = 0;
                _loc_10.y = 0;
                _loc_10.z = 1;
                _loc_8++;
            }
            return;
        }// end function

        private function initNoFaceCamera(param1:ParticleStatus, param2:ParticleParams) : void
        {
            var _loc_5:ParticleItem = null;
            var _loc_10:int = 0;
            var _loc_11:Vector3D = null;
            var _loc_3:* = param1.particleList;
            var _loc_4:* = _loc_3.length;
            var _loc_6:* = param2.surfaceData["" + FilterName_ID.PARAM3_ID + ":4:true"];
            var _loc_7:* = param2.surfaceData["" + FilterName_ID.PARAM4_ID + ":3:true"];
            var _loc_8:* = param2.numOfmeshVertex;
            var _loc_9:int = 0;
            while (_loc_9 < _loc_4)
            {
                
                _loc_5 = _loc_3[_loc_9];
                _loc_10 = _loc_9 * _loc_8 * 4;
                _loc_5.aRotateAngle = _loc_6[_loc_10++];
                _loc_5.aRotateAngleOffset = _loc_6[_loc_10++];
                _loc_10 = _loc_9 * _loc_8 * 3;
                _loc_11 = _loc_5.aRotateAxis;
                _loc_11.x = _loc_7[_loc_10++];
                _loc_11.y = _loc_7[_loc_10++];
                _loc_11.z = _loc_7[_loc_10++];
                _loc_9++;
            }
            return;
        }// end function

    }
}
